package org.simpleflatmapper.datastax.test;
import com.datastax.driver.core.DataType;
import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.Map;
public class DatastaxHelper {
private static final String CASSANDRA_STARTED = "sfm.cassandra.started";
public static void startCassandra() throws Exception {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(DatastaxHelper.class.getClassLoader());
// deal with multiple classloader
synchronized (CASSANDRA_STARTED) {
if (System.getProperty(CASSANDRA_STARTED) == null) {
fixTypeCodec();
// cassandra does some check on the java version
// expect a dot not present in java 9 ea 126
String vmversion = System.getProperty("java.vm.version");
if (vmversion.startsWith("9-ea")) {
System.out.println("override java version prop");
System.setProperty("java.vm.version", "25.51-b03");
}
File configFile = new File("target/embeddedCassandra/cu-cassandra.yaml");
configFile.getParentFile().mkdirs();
InputStream is = EmbeddedCassandraServerHelper.class.getResourceAsStream("/cu-cassandra.yaml");
try {
OutputStream os = new FileOutputStream(configFile);
byte[] buffer = new byte[4096];
try {
int l;
while ((l = is.read(buffer)) != -1) {
os.write(buffer, 0, l);
}
} finally {
os.close();
}
} finally {
is.close();
}
String cassandraConfig = "file:" + configFile.getAbsolutePath();
System.setProperty("cassandra.config", cassandraConfig);
System.setProperty("cassandra.native.epoll.enabled", "false");
System.out.println("Starting Cassandra " + cassandraConfig);
EmbeddedCassandraServerHelper.startEmbeddedCassandra(300000L);
System.out.println("Started Cassandra");
System.setProperty(CASSANDRA_STARTED, "true");
} else {
System.out.println("CASSANDRA_STARTED = " + System.getProperty(CASSANDRA_STARTED));
}
}
} finally {
Thread.currentThread().setContextClassLoader(classLoader);
}
}
@SuppressWarnings("unchecked")
private static void fixTypeCodec() {
try {
System.out.println("PRINT CONNENDRUM");
Field f = Class.forName("com.datastax.driver.core.TypeCodec").getDeclaredField("primitiveCodecs");
f.setAccessible(true);
Map o = (Map) f.get(null);
System.out.println("primitiveCodecs = " + o);
Class<?> longCodec = Class.forName("com.datastax.driver.core.TypeCodec$LongCodec");
Field instance = longCodec.getDeclaredField("newInstance");
instance.setAccessible(true);
Object longCodeInstance = instance.get(null);
System.out.println("LongCodec.newInstance = " + longCodeInstance);
if (o.get(DataType.Name.BIGINT) == null) {
//noinspection unchecked,unchecked,unchecked
o.put(DataType.Name.BIGINT, longCodeInstance);
o.put(DataType.Name.COUNTER, longCodeInstance);
o = (Map) f.get(null);
System.out.println("primitiveCodecs = " + o);
}
} catch(Throwable e ) {
// used only for 2.1 drivers
}
}
}